package Web;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 服务器端
 * 1. 创建DatagramSocket：使用new DatagramSocket(PORT)创建一个DatagramSocket对象并绑定到指定端口（PORT），用于监听客户端发送过来的数据。
 * 2. 接收数据：通过receive方法阻塞等待接收客户端发送的DatagramPacket，该数据包包含了客户端发送的数据以及客户端的地址和端口信息。
 * 3. 处理数据并发送响应：获取客户端的地址和端口，将接收到的数据转换为字符串，构造响应数据后，创建新的DatagramPacket并指定目标地址（客户端地址）和端口，然后使用send方法发送响应。
 * */


public class UDPServer {
    private static final int PORT = 9999;  // 监听的端口号

    public static void main(String[] args) {
        // 创建监听实例
        try (DatagramSocket serverSocket = new DatagramSocket(PORT)) {
            System.out.println("UDP服务器已启动，正在监听端口 " + PORT + "......");
            while (true) {
                // 创建一个字节数组缓冲区，用于存储接收到的数据
                byte[] buffer = new byte[1024];
                // 创建DatagramPacket对象用于接收数据，指定缓冲区和缓冲区大小
                DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
                // 调用receive方法接收数据，该方法会阻塞直到接收到数据
                serverSocket.receive(receivePacket);

                // 获取发送数据的客户端的地址和端口
                InetAddress clientAddress = receivePacket.getAddress();
                int clientPort = receivePacket.getPort();

                // 将接收到的字节数组转换为字符串
                String receivedData = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("接收到来自 " + clientAddress + ":" + clientPort + " 的数据: " + receivedData);

                // 构造响应数据
                String response = "你发送的内容是: " + receivedData;
                byte[] responseData = response.getBytes();

                // 创建DatagramPacket对象用于发送数据，指定数据、数据长度、目标地址和端口
                DatagramPacket sendPacket = new DatagramPacket(responseData, responseData.length, clientAddress, clientPort);
                // 调用send方法发送数据
                serverSocket.send(sendPacket);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
